home *** CD-ROM | disk | FTP | other *** search
- ⓪ IMPLEMENTATION MODULE Block;⓪ (*$Y+*)⓪ ⓪ (*$L-,N+*)⓪ ⓪ (*⓪!* Autor: Wolfgang Keller (W.K) Copyright (C) 1989⓪!* Dieter Hametner (D.H)⓪!*⓪!* Erstellt: 23.08.89 System: MEGAMAX Modula-2 V1.1⓪!*⓪!* --------------------------------------------------------------------------⓪!* Datum Version Autor Arbeitsbericht⓪!* --------------------------------------------------------------------------⓪!* 23.08.89 | 0001 | W.K | neues universelles ByteCopy implementiert.⓪!* 0005 | W.K | Clear implementiert.⓪!* | Ganzes Modul fertig ausgetestet.⓪!* 0007 | T.T | Clear: End-Löschen optimiert.⓪!* 30.08.89 | 0007 | T.T | Clear allg. korrigiert; Copy optimiert;⓪!* D3 wird nicht mehr zerstört⓪!*⓪!* --------------------------------------------------------------------------⓪!* Interne Modulversion V#0007#⓪!* --------------------------------------------------------------------------⓪!*)⓪ ⓪ FROM SYSTEM IMPORT ASSEMBLER, ADDRESS;⓪ ⓪ ⓪ PROCEDURE Copy (from: ADDRESS; n: LONGCARD; to: ADDRESS);⓪"(*⓪#* Kopiert 'n' Byte vom Adresse 'from' nach Adresse 'to' und⓪#* berücksichtigt dabei Überschneidungen.⓪#*)⓪#⓪"BEGIN⓪$ASSEMBLER⓪)MOVE.L -(A3),A1 ; A1 := to⓪)MOVE.L -(A3),D0 ; D0 := n⓪)MOVE.L -(A3),A0 ; A0 := from⓪ ⓪)MOVE.L A1,D2⓪)SUB.L A0,D2⓪)BLT.L normcopy⓪)CMP.L D0,D2⓪)BLT.L revcopy⓪ ⓪ normcopy⓪)MOVE.L A0,D1 ; D1 := ODD( from )⓪)AND.B #1,D1 ;⓪)BNE fromIsOdd⓪ ⓪)MOVE.L A1,D1 ; D1 := ODD( to )⓪)AND.B #1,D1 ;⓪)BNE.L calcbytecopy⓪)BRA calcmulticopy⓪ ⓪ fromIsOdd⓪)MOVE.L A1,D1 ; D1 := ODD( to )⓪)AND.B #1,D1 ;⓪)BNE moveOneByte⓪)BRA.L calcbytecopy⓪ ⓪ moveOneByte⓪)SUBQ.L #1,D0⓪)BCS.W ende⓪)MOVE.B (A0)+,(A1)+⓪ ⓪ calcmulticopy⓪)MOVE.L D0,D2 ; D2 := n⓪ ⓪)AND.W #$FF,D0 ; D0 := n MOD 256⓪ ⓪@; D2 korrekt berechnet für multicopy⓪@; D0 restbytes⓪ ⓪)MOVE.W D0,D1⓪)AND.W #7,D1 ; D1 := n MOD 8 (Parameter für restcopy)⓪)LSR.W #3,D0 ; D0 := n DIV 8 (Parameter für longcopy)⓪ ⓪)LSR.L #8,D2 ; D2 := n DIV 256⓪ ⓪)BEQ.L longcopy ; Fall D2 = 0 gleich nach longcopy⓪ multicopy⓪)MOVEM.L D0-D1/D3-D7/A2-A6,-(A7)⓪)SWAP D2⓪)MOVE.L D2,-(A7)⓪)SWAP D2⓪)BRA startmulti⓪ ⓪ multiloop1⓪)MOVE.L D2,(A7)⓪)SWAP D2⓪ multiloop2⓪)MOVE.W D2,(A7)⓪); 256 Byte kopieren⓪)MOVEM.L (A0)+,D0-D7/A2-A6 ; LOAD⓪)MOVEM.L D0-D7/A2-A6,(A1) ; STORE⓪)ADDA.W #52,A1⓪)MOVEM.L (A0)+,D0-D7/A2-A6 ; LOAD⓪)MOVEM.L D0-D7/A2-A6,(A1) ; STORE⓪)ADDA.W #52,A1⓪)MOVEM.L (A0)+,D0-D7/A2-A6 ; LOAD⓪)MOVEM.L D0-D7/A2-A6,(A1) ; STORE⓪)ADDA.W #52,A1⓪)MOVEM.L (A0)+,D0-D7/A2-A6 ; LOAD⓪)MOVEM.L D0-D7/A2-A6,(A1) ; STORE⓪)ADDA.W #52,A1⓪)MOVEM.L (A0)+,D1-D7/A2-A6 ; LOAD⓪)MOVEM.L D1-D7/A2-A6,(A1) ; STORE⓪)ADDA.W #48,A1⓪)MOVE.W (A7),D2⓪ startmulti⓪)DBF D2,multiloop2⓪)SWAP D2⓪)MOVE.W 2(A7),D2⓪)DBF D2,multiloop1⓪ ⓪)ADDQ.L #4,A7⓪)MOVEM.L (A7)+,D0-D1/D3-D7/A2-A6⓪)BRA.L longcopy⓪ ⓪ longloop⓪)MOVE.L (A0)+,(A1)+ ; copy Longwords⓪)MOVE.L (A0)+,(A1)+ ; copy Longwords⓪ longcopy DBF D0,longloop⓪ ⓪)BRA restcopy⓪ ⓪ calcbytecopy⓪)MOVE.W D0,D1 ; D1 := n⓪)AND.W #7,D1 ; D1 := n MOD 8⓪)LSR.L #3,D0 ; D0 := n DIV 8⓪)BRA bytecopy⓪ byteloop1⓪)SWAP D0⓪ byteloop2⓪)MOVE.B (A0)+,(A1)+⓪)MOVE.B (A0)+,(A1)+⓪)MOVE.B (A0)+,(A1)+⓪)MOVE.B (A0)+,(A1)+⓪)MOVE.B (A0)+,(A1)+⓪)MOVE.B (A0)+,(A1)+⓪)MOVE.B (A0)+,(A1)+⓪)MOVE.B (A0)+,(A1)+⓪ bytecopy DBF D0,byteloop2⓪)SWAP D0⓪)DBF D0,byteloop1⓪ ⓪)BRA restcopy⓪ restloop MOVE.B (A0)+,(A1)+⓪ restcopy DBF D1,restloop⓪ ende RTS ; ende von bytecopy⓪ ⓪ revcopy⓪)ADDA.L D0,A1 ; to := to + n⓪)ADDA.L D0,A0 ; from := from + n;⓪ ⓪)MOVE.L A0,D1 ; D1 := ODD( from )⓪)AND.B #1,D1 ;⓪)BNE rfromIsOdd⓪ ⓪)MOVE.L A1,D1 ; D1 := ODD( to )⓪)AND.B #1,D1 ;⓪)BNE.L rcalcbytecopy⓪)BRA rcalcmulticopy⓪ ⓪ rfromIsOdd⓪)MOVE.L A1,D1 ; D1 := ODD( to )⓪)AND.B #1,D1 ;⓪)BNE rmoveOneByte⓪)BRA.L rcalcbytecopy⓪ ⓪ rmoveOneByte⓪)SUBQ.L #1,D0⓪)BCS ende⓪)MOVE.B -(A0),-(A1)⓪ ⓪ rcalcmulticopy⓪)MOVE.L D0,D2 ; D2 := n⓪ ⓪)AND.W #$FF,D0 ; D0 := n MOD 256⓪ ⓪@; D2 korrekt berechnet für multicopy⓪@; D0 restbytes⓪ ⓪)MOVE.W D0,D1⓪)AND.W #7,D1 ; D1 := n MOD 8 (Parameter für restcopy)⓪)LSR.W #3,D0 ; D0 := n DIV 8 (Parameter für longcopy)⓪ ⓪)LSR.L #8,D2 ; D2 := n DIV 256⓪ ⓪)BEQ.L rlongcopy ; Fall D2 = 0 gleich nach longcopy⓪ rmulticopy⓪)MOVEM.L D0-D1/D3-D7/A2-A6,-(A7)⓪)SWAP D2⓪)MOVE.L D2,-(A7)⓪)SWAP D2⓪)BRA rstartmulti⓪)⓪ rmultiloop1⓪)MOVE.L D2,(A7)⓪)SWAP D2⓪ rmultiloop2⓪)MOVE.W D2,(A7)⓪); 256 Byte kopieren⓪)SUBA.W #52,A0⓪)MOVEM.L (A0),D0-D7/A2-A6 ; LOAD⓪)MOVEM.L D0-D7/A2-A6,-(A1) ; STORE⓪)SUBA.W #52,A0⓪)MOVEM.L (A0),D0-D7/A2-A6 ; LOAD⓪)MOVEM.L D0-D7/A2-A6,-(A1) ; STORE⓪)SUBA.W #52,A0⓪)MOVEM.L (A0),D0-D7/A2-A6 ; LOAD⓪)MOVEM.L D0-D7/A2-A6,-(A1) ; STORE⓪)SUBA.W #52,A0⓪)MOVEM.L (A0),D0-D7/A2-A6 ; LOAD⓪)MOVEM.L D0-D7/A2-A6,-(A1) ; STORE⓪)SUBA.W #48,A0⓪)MOVEM.L (A0),D1-D7/A2-A6 ; LOAD⓪)MOVEM.L D1-D7/A2-A6,-(A1) ; STORE⓪)MOVE.W (A7),D2⓪ rstartmulti⓪)DBF D2,rmultiloop2⓪)SWAP D2⓪)MOVE.W 2(A7),D2⓪)DBF D2,rmultiloop1⓪ ⓪)ADDQ.L #4,A7⓪)MOVEM.L (A7)+,D0-D1/D3-D7/A2-A6⓪)BRA.L rlongcopy⓪ rlongloop⓪)MOVE.L -(A0),-(A1) ; copy Longwords⓪)MOVE.L -(A0),-(A1) ; copy Longwords⓪ rlongcopy DBF D0,rlongloop⓪ ⓪)BRA rrestcopy⓪ ⓪ rcalcbytecopy⓪)MOVE.W D0,D1 ; D1 := n⓪)AND.W #7,D1 ; D1 := n MOD 8⓪)LSR.L #3,D0 ; D0 := n DIV 8⓪)BRA rbytecopy⓪ rbyteloop1⓪)SWAP D0⓪ rbyteloop2⓪)MOVE.B -(A0),-(A1)⓪)MOVE.B -(A0),-(A1)⓪)MOVE.B -(A0),-(A1)⓪)MOVE.B -(A0),-(A1)⓪)MOVE.B -(A0),-(A1)⓪)MOVE.B -(A0),-(A1)⓪)MOVE.B -(A0),-(A1)⓪)MOVE.B -(A0),-(A1)⓪ rbytecopy DBF D0,rbyteloop2⓪)SWAP D0⓪)DBF D0,rbyteloop1⓪)⓪)BRA rrestcopy⓪ rrestloop⓪)MOVE.B -(A0),-(A1)⓪ rrestcopy DBF D1,rrestloop⓪ ⓪$END;⓪"END Copy;⓪ ⓪ ⓪ PROCEDURE Clear (from: ADDRESS; n: LONGCARD);⓪"(*⓪#* Löscht ab 'from' 'n' Byte.⓪#*)⓪"⓪"BEGIN⓪$ASSEMBLER⓪)MOVE.L -(A3),D0 ; D0 := n⓪)MOVE.L -(A3),A0 ; A0 := from⓪)BEQ ende⓪)ADDA.L D0,A0 ; A0 := from + n⓪ ⓪)MOVEQ.L #0,D2⓪ ⓪)MOVE.L A0,D1 ; D1 := ODD( from )⓪)AND.B #1,D1 ;⓪)BEQ calcmulticlear⓪ ⓪ fromIsOdd⓪)MOVE.B D2,-(A0) ; Clear one byte⓪)SUBQ.L #1,D0 ; jetzt ist A0 gerade !⓪)BRA calcmulticlear⓪ ⓪ ende RTS⓪ ⓪ calcmulticlear⓪)MOVE.L D0,D1 ; D1 := n⓪ ⓪)AND.W #$FF,D0 ; D0 := n MOD 256⓪@; in D0 sind also die restbytes⓪)LSR.L #8,D1 ; D1 := n DIV 256⓪ ⓪)BEQ.L calclongclear ; Fall D1 = 0 gleich nach calclongclear⓪ ⓪ multiclear⓪)MOVEM.L D0/D3-D7/A3-A6,-(A7)⓪)MOVE.L D2,D0⓪)MOVE.L D2,D3⓪)MOVE.L D2,D4⓪)MOVE.L D2,D5⓪)MOVE.L D2,D6⓪)MOVE.L D2,D7⓪)MOVE.L D2,A1⓪)MOVE.L D2,A2⓪)MOVE.L D2,A3⓪)MOVE.L D2,A4⓪)MOVE.L D2,A5⓪)MOVE.L D2,A6⓪)BRA startmulti⓪ ⓪ multiloop1⓪)SWAP D1⓪ multiloop2⓪); clear 256 Byte⓪)MOVEM.L D0/D2-D7/A1-A6,-(A0) ; 52⓪)MOVEM.L D0/D2-D7/A1-A6,-(A0) ; 52⓪)MOVEM.L D0/D2-D7/A1-A6,-(A0) ; 52⓪)MOVEM.L D0/D2-D7/A1-A6,-(A0) ; 52⓪)MOVEM.L D2-D7/A1-A6,-(A0) ; 48⓪ startmulti⓪)DBF D1,multiloop2⓪)SWAP D1⓪)DBF D1,multiloop1⓪ ⓪)MOVEM.L (A7)+,D0/D3-D7/A3-A6⓪ ⓪ calclongclear ; Parameter in D0⓪)MOVE.W D0,D1 ; D1 := n die restlichen bytes⓪)AND.W #7,D1 ; D1 := n MOD 8 (Parameter für restclear)⓪)LSR.W #3,D0 ; D0 := n DIV 8 (Parameter für longclear)⓪)BRA longclear⓪ ⓪ longloop⓪)MOVE.L D2,-(A0) ; copy Longwords⓪)MOVE.L D2,-(A0) ; copy Longwords⓪ longclear⓪)DBF D0,longloop⓪ ⓪)BRA restclear⓪ restloop⓪)MOVE.B D2,-(A0)⓪ restclear⓪)DBF D1,restloop⓪$END;⓪"END Clear;⓪ ⓪ ⓪ END Block.⓪ ə
- (* $FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173$FFEE3173Ç$000018FET........T.......T......T.......T.......T.......T.......T.......T.......T.......$00002039$00001FD7$00001FCB$000015FA$00000EF3$00000DC4$00001695$0000172D$000017C9$000018FE$00000439$0000002B$FFEDB15C$FFEDB15C$00000034$FFEE3173¶Çé*)
-